import request from '@/utils/request'

/**
 * @param {string} path
 * @returns {Boolean}
 */
export function isExternal(path) {
  return /^(https?:|mailto:|tel:)/.test(path)
}

/**
 * 验证登陆名
 */
export function validLoginName(rule, value, callback) {
  let reg = /^[A-Za-z0-9\u4e00-\u9fa5]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+$/
  let result = reg.test(value)
  reg = /^[A-Za-z0-9\u4e00-\u9fa5]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+$/
  result = result === false ? reg.test(value) : true
  reg = /^1[3456789]\d{9}$/
  result = result === false ? reg.test(value) : true
  if (result) {
    callback()
  } else {
    callback(new Error('输入内容不少于3个汉字字母和数字'))
  }
}

/**
 * 验证用户名
 */
export function validUserName(rule, value, callback) {
  const reg = /^[a-zA-Z0-9\u4e00-\u9fa5][a-zA-Z0-9_\u4e00-\u9fa5]{2,9}$/
  if (reg.test(value)) {
    callback()
  } else {
    callback(new Error('输入内容应为3-10个中文、英文、数字或下划线字符'))
  }
}

/**
 * 验证登陆密码
 */
export function validatePassword(rule, value, callback) {
  const reg = /^[a-zA-Z][a-zA-Z0-9!@#$~]{5,17}$/
  if (!reg.test(value)) {
    callback(new Error('输入内容应以字母开头并且长度为6-18'))
  } else {
    callback()
  }
}

/**
 * 验证邮箱
 */
export function validEmail(rule, value, callback) {
  const reg = /^[A-Za-z0-9\u4e00-\u9fa5]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+$/
  if (!value || reg.test(value)) {
    callback()
  } else {
    callback(new Error('邮箱格式不正确'))
  }
}

/**
 * 验证手机
 */
export function validMobile(rule, value, callback) {
  const reg = /^1[3456789]\d{9}$/
  if (!value || reg.test(value)) {
    callback()
  } else {
    callback(new Error('手机格式不正确'))
  }
}

/**
 * 验证URL
 */
export function validURL(rule, value, callback) {
  const reg = /^(https?|ftp):\/\/([a-zA-Z0-9.-]+(:[a-zA-Z0-9.&%$-]+)*@)*((25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]?)(\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3}|([a-zA-Z0-9-]+\.)*[a-zA-Z0-9-]+\.(com|edu|gov|int|mil|net|org|biz|arpa|info|name|pro|aero|coop|museum|[a-zA-Z]{2}))(:[0-9]+)*(\/($|[a-zA-Z0-9.,?'\\+&%$#=~_-]+))*$/
  if (!value || reg.test(value)) {
    callback()
  } else {
    callback(new Error('URL地址不正确'))
  }
}

/**
 * 验证小写
 */
export function validLowerCase(str) {
  const reg = /^[a-z]+$/
  return reg.test(str)
}

/**
 * 验证大写
 */
export function validUpperCase(str) {
  const reg = /^[A-Z]+$/
  return reg.test(str)
}

/**
 * 验证字母
 */
export function validAlphabets(str) {
  const reg = /^[A-Za-z]+$/
  return reg.test(str)
}

/**
 * 验证相等
 */
export function validIdentical(rule, value, callback) {
  const identical = rule.other
  if (identical && identical === value) {
    callback()
  }
  callback(new Error(rule.message))
}

/**
 * 验证不等
 */
export function validDifferent(rule, value, callback) {
  const identical = rule.other
  if (identical && identical !== value) {
    callback()
  }
  callback(new Error(rule.message))
}

/**
 * 验证正则表达式
 */
export function validRegexp(rule, value, callback) {
  if (new RegExp(rule.regexp).test(value)) {
    callback()
  }
  callback(new Error(rule.message))
}

/**
 * 验证唯一性
 */
export function validateUniq(rule, value, callback) {
  if (value === undefined || value === '') {
    rule.message = '该项不能为空'
    return callback(new Error(rule.message))
  }

  if (rule.url) {
    const param = rule.param.replaceParam
    rule.param[param] = value
    request.get(rule.url, {
      params: rule.param
    }).then(response => {
      if (response.valid) {
        callback()
      } else {
        callback(new Error(rule.message))
      }
    }).catch(() => {
      callback()
    })
  } else {
    callback()
  }
}

/**
 * @param {string} str
 * @returns {Boolean}
 */
export function isString(str) {
  if (typeof str === 'string' || str instanceof String) {
    return true
  }
  return false
}

/**
 * @param {Array} arg
 * @returns {Boolean}
 */
export function isArray(arg) {
  if (typeof Array.isArray === 'undefined') {
    return Object.prototype.toString.call(arg) === '[object Array]'
  }
  return Array.isArray(arg)
}

export async function blobValidate(data) {
  try {
    const text = await data.text()
    JSON.parse(text)
    return false
  } catch (error) {
    return true
  }
}
